Tenemos el siguiente programa:
#include <iostream> using namespace std; int main() { double peso; string categoria; cin >> peso; if (peso < 50.0) { categoria = "Ligero"; } else if (peso < 70.0) { categoria = "Medio"; } else { categoria = "Pesado"; } cout << categoria << endl; }
El programa muestra la categoria de un boxeador basándose en su peso (los límites y las categorías estan simplificados y no son reales, claro). El caso es que calcular esto implica hacer una seria de ifs para poder obtener la categoría (un string) a partir del peso (un double).
Qué ocurre si ahora queremos hacer un programa que haga el mismo cálculo (obtener la categoría de un boxeador) dos veces??
Es decir: supongamos que ahora queremos hacer un programa donde se introducen dos pesos y el programa dice si el combate entre dos boxeadores con esos dos pesos se puede celebrar. Se trataría simplemente de mirar si estan en la misma categoría, pero eso implica calcular la categoria de los dos por separado.
Con los conocimientos que tenemos hasta ahora, haríamos un programa así:
#include <iostream> using namespace std; int main() { double peso1, peso2; string categoria1, categoria2; cin >> peso1 >> peso2; if (peso1 < 50.0) { categoria1 = "Ligero"; } else if (peso1 < 70.0) { categoria1 = "Medio"; } else { categoria1 = "Pesado"; } if (peso2 < 50.0) { categoria2 = "Ligero"; } else if (peso2 < 70.0) { categoria2 = "Medio"; } else { categoria2 = "Pesado"; } if (categoria1 == categoria2) { cout << "El combate se puede celebrar" << endl; } else { cout << "No hay comabate" << endl; } }
El problema con este programa es la repetición. Las instrucciones centrales son casi iguales, salvo por peso1/peso2 y categoria1/categoria2. Esto no es aceptable porque si queremos hacer programas más complejos, necesitamos alguna manera de "hacer nuevas instrucciones" para que no tengamos que repetir las mismas instrucciones varias veces.
La forma de resolver esto es hacer una función: un subprograma que calcula la categoria a partir del peso, y que llamaremos desde el main (que es el programa principal). El programa inicial que teníamos (donde se calculaba solo la categoria de un boxeador) lo vamos a transformar en un subprograma así:
string determina_categoria(double peso) { string categoria; if (peso < 50.0) { categoria = "Ligero"; } else if (peso1 < 70.0) { categoria = "Medio"; } else { categoria = "Pesado"; } return categoria; }
Esto es un subprograma, y su nombre es determina_categoria. A la izquierda del nombre aparece el tipo de los resultados que devuelve este subprograma, que es string (una categoria es un string). A la derecha aparecen, entre paréntesis, los datos de entrada que necesita el subprograma para calcular el resultado. Si hay más de uno, se separan por comas. En este caso solo hay double peso, o sea que hay un dato de entrada que es un real y es el peso del boxeador.
El código del subprograma utiliza peso directamente y declara una variable categoria que sirve para almacenar el resultado. Pero al final, en vez de mostrar el resultado por la pantalla, se hace:
return categoria;
Esta instrucción especial devuelve el resultado. La palabra return es especial en C++ y sirve para devolver el resultado en una función como esta.
[La documentación sigue en el próximo tema: Subprogramas 2.]
En preparación